/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Modelo;

import Controlador.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import Controlador.XMLar;
import Vista.Datos;
import Vista.Grafico;
import java.awt.Image;
import java.applet.Applet;
import java.awt.Graphics;
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
/**
 *
 * @author VIC
 */
public class Mapa implements Serializable {
    int tamX;
    int tamY;
    private static Image marco;
    private Graphics g2d;
    private Applet app;
    private int  xinicio,yinicio;
    Object[][][] matriz ;
    public static Image tierra,mar,aire;
    Point punto;
    //public static ArrayList<Image> escenarios = new ArrayList<Image>();
    public void setCuadrado(Point punto){
        this.punto=punto;
    }
    public static void cargarEscenarios(){
        MediaTracker mt = new MediaTracker( Grafico.applet ) ;
        tierra=Grafico.applet.getImage(Grafico.applet.getCodeBase(),"Imagenes\\land.png");
        mar=Grafico.applet.getImage(Grafico.applet.getCodeBase(),"Imagenes\\sea.png");
        aire=Grafico.applet.getImage(Grafico.applet.getCodeBase(),"Imagenes\\air.png");
        marco=Grafico.applet.getImage(Grafico.applet.getCodeBase(),"Imagenes/marco.png");
        mt.addImage(tierra,0);
        mt.addImage(mar,1);
        mt.addImage(aire,2);
        mt.addImage(marco,3);
        try {
            mt.waitForAll();
        } catch (InterruptedException e) {
             // TODO Auto-generated catch block
           e.printStackTrace();
        }
    }

        public Mapa(String arch,ArrayList<Construccion> cons,ArrayList<Coordenadas> coor,Legion [] armada){
            
            ArrayList<String> ar=new ArrayList<String>(); //ar = arreglo que almacena las lineas del arch de texto
            try{
                 BufferedReader l= new BufferedReader(new FileReader(arch));
                 String cad=l.readLine();
                 ar.add(cad);

                 tamY=cad.length();

                 tamX=1;
                 while(( cad=l.readLine() )!=null){
                     ar.add(cad);
                     tamX++;
                 }

                 matriz=new Object[tamX][tamY][3];
                 l.close();
                 for(int i=0;i<tamX;i++){

                     for(int j=0;j<tamY;j++)
                         matriz[i][j][0]=new Terreno(ar.get(i).charAt(j));
                 }
            }
            catch (Exception e){}
            int longx=0;
            int longy=0;
            for(int i=0;i<cons.size();i++){
                if(cons.get(i) instanceof Cuartel)
                {
                    longx=Cuartel.longx;
                    longy=Cuartel.longy;
                }
                else if(cons.get(i) instanceof Astillero)
                {
                    longx=Astillero.longx;
                    longy=Astillero.longy;
                }
                else if(cons.get(i) instanceof Hangar)
                {
                    longx=Hangar.longx;
                    longy=Hangar.longy;
                }
                else if(cons.get(i) instanceof Cabanha)
                {
                    longx=Cabanha.longx;
                    longy=Cabanha.longy;
                }
                else if(cons.get(i) instanceof Casa)
                {
                    longx=Casa.longx;
                    longy=Casa.longy;
                }
                else if(cons.get(i) instanceof Bungalow)
                {
                    longx=Bungalow.longx;
                    longy=Bungalow.longy;
                }
                else if(cons.get(i) instanceof Palafito)
                {
                    longx=Palafito.longx;
                    longy=Palafito.longy;
                }
                else if(cons.get(i) instanceof Parlamento)
                {
                    longx=Parlamento.longx;
                    longy=Parlamento.longy;
                }
                else if(cons.get(i) instanceof Mansion)
                {
                    longx=Mansion.longx;
                    longy=Mansion.longy;
                }
                else if(cons.get(i) instanceof Palacio)
                {
                    longx=Palacio.longx;
                    longy=Palacio.longy;
                }
                else if(cons.get(i) instanceof Intendencia)
                {
                    longx=Intendencia.longx;
                    longy=Intendencia.longy;
                }
                else if(cons.get(i) instanceof PozoPetrolero)
                {
                    longx=PozoPetrolero.longx;
                    longy=PozoPetrolero.longy;
                }
                else if(cons.get(i) instanceof Granja)
                {
                    longx=Granja.longx;
                    longy=Granja.longy;
                }
                else if(cons.get(i) instanceof MinaDeMinerales)
                {
                    longx=MinaDeMinerales.longx;
                    longy=MinaDeMinerales.longy;
                }
                else if(cons.get(i) instanceof Aserradero)
                {
                    longx=Aserradero.longx;
                    longy=Aserradero.longy;
                }
            
                ubicarConstruccion(coor.get(i).getX(),coor.get(i).getY(),longx,longy,cons.get(i),cons.get(i).getSimbolo());

            }
            for(int i=0;i<9;i++){
                for(int j=0;j<armada[i].devolverUnidades().size();j++){
                    ubicarObjeto(armada[i].devolverCoordenadas().get(j).getX(),armada[i].devolverCoordenadas().get(j).getY(),armada[i].devolverUnidades().get(j));
                }
            }
        }
	public Mapa(){
            g2d = Grafico.g;
            punto =new Point(-1,-1);
            app = Grafico.applet;
            xinicio=0;
            yinicio=0;
            ArrayList<String> ar=new ArrayList<String>();
            
         String mapaElegido="";
         int opcion = 4;
         switch(opcion){
             case 1: mapaElegido="mapa.txt";
                    break;
             case 2: mapaElegido="mapa2.txt";
                    break;
             case 3: mapaElegido="mapa3.txt";
                    break;
             case 4: mapaElegido="mapa4.txt";
                    break;
         }
        String fileToRead=mapaElegido;
        StringBuffer strBuff;
        String line;
        URL url = null;
        try{
            url = new URL(Grafico.applet.getCodeBase(), fileToRead);
        }
        catch(MalformedURLException e){}
        BufferedReader bf;
        try{
            InputStream in = url.openStream();
            bf = new BufferedReader(new InputStreamReader(in));
            strBuff = new StringBuffer();
            tamX=0;
            while((line = bf.readLine()) != null){
                ar.add(line);
                //System.out.println(line);
                tamX++;
                strBuff.append(line + "\n");
                tamY=line.length();
            }
            
            bf.close();
        }

        catch(IOException e){
            e.printStackTrace();
        }
             /*BufferedReader l= new BufferedReader(new FileReader(mapaElegido));
             String cad=l.readLine();
             ar.add(cad);*/
             //tamY=cad.length();
             //tamX=1;
             /*while(( cad=l.readLine() )!=null){
                 ar.add(cad);
                 tamX++;
             }*/
             
             matriz=new Object[tamX][tamY][3];
             
             for(int i=0;i<tamX;i++){
                 for(int j=0;j<tamY;j++)
                     matriz[i][j][0]=new Terreno(ar.get(i).charAt(j));
             }
    /*     catch (Exception e){}
         Juego.nombreMapa=mapaElegido;*/
             //matriz[4][4][2]=new Soldado();;
	}

        public void imprimirMapa(String archivo){
            try {
            BufferedReader Lmapa= new BufferedReader(new FileReader(archivo));
            String cad;
            while((cad=Lmapa.readLine())!=null)
                //System.out.println(cad);
            Lmapa.close();
        }
        catch (Exception e){}
        }

       /* public void mostrar(){
            for(int i = 0; i < tamX; i++){
		for(int j = 0; j < tamY; j++){
                    if(matriz[i][j][1]!= null)


                        System.out.print(((Construccion)matriz[i][j][1]).getSimbolo());

                        //System.out.print(((Construccion)matriz[i][j][1]).getSimbolo());

                   else if(matriz[i][j][2]!= null)
                        System.out.print(((Objeto)matriz[i][j][2]).getSimbolo());
                    else
                        System.out.print(((Terreno)matriz[i][j][0]).getSimbolo());
                }
                //System.out.println();
            }
	}
*/
       public void mostrar(){
           int xpos;
           int ypos;

           for(int i = 0; i < 18; i++){
		for(int j = 0; j < 18; j++){
                    xpos=xinicio+i;
                    ypos=yinicio+j;
                    Grafico.g.drawImage(((Terreno)matriz[xpos][ypos][0]).getImagen(), i*25,50+ j*25,25,25,Grafico.applet);
                }
           }
            for(int i = 0; i < 18; i++){
		for(int j = 0; j < 18; j++){
                    xpos=xinicio+i;
                    ypos=yinicio+j;
                    //Grafico.g.drawImage(((Terreno)matriz[xpos][ypos][0]).getImagen(), i*25,50+ j*25,25,25,Grafico.applet);
                    if(matriz[xpos][ypos][2]!=null/*true==false*/) {
                        Grafico.g.drawImage(((UnidadMilitar)matriz[xpos][ypos][2]).imagen(), i*25,50+ j*25,25,25,Grafico.applet);
                    }
                    int lx=0,ly=0;
                    if(matriz[xpos][ypos][1]!=null && !((Construccion)matriz[xpos][ypos][1]).getUsado()){
                        lx = ((Construccion)matriz[xpos][ypos][1]).getLongx();
                        ly = ((Construccion)matriz[xpos][ypos][1]).getLongy();
                        Grafico.g.drawImage(((Construccion)matriz[xpos][ypos][1]).getImagen(), (xpos-xinicio)*25,50+(ypos-yinicio)*25,lx*25, ly*25, Grafico.applet);
                        ((Construccion)matriz[xpos][ypos][1]).trueUsado();
                    
                        Construccion ob=(Construccion)matriz[xpos][ypos][1];
                        if( ob.getEstado()!=-1)
                        if( ( ob.getDuracion() + ob.getTiempoInicial()) <= Juego.turno ){
                         //   Grafico.g.drawImage(marco, (x-xinicio)*25,50+(y-yinicio)*25,lx*25, ly*25, Grafico.applet);
                            Grafico.g.setColor(Color.yellow);
                            Grafico.g.drawRect((xpos-xinicio)*25,50+(ypos-yinicio)*25,lx*25, ly*25);
                            Grafico.g.setColor(Color.red);
                        }
                    }
                    
                }
            }
            for(int i = 0; i < GestorConstrucciones.getConstrucciones().size(); i++)
                GestorConstrucciones.getConstruccion(i).falseUsado();
            
//            for(int i = 0; i < GestorConstrucciones.getConstrucciones().size(); i++){
//                    int lx = GestorConstrucciones.getConstruccion(i).getLongx();
//                    int ly = GestorConstrucciones.getConstruccion(i).getLongy();
//                    int x =GestorConstrucciones.getCoordenadax(i);
//                    int y =GestorConstrucciones.getCoordenaday(i);
//                    //if(x>=xinicio && y>=yinicio )
//                    Grafico.g.drawImage(GestorConstrucciones.getConstruccion(i).getImagen(), (x-xinicio)*25,50+(y-yinicio)*25,lx*25, ly*25, Grafico.applet);
//                    Construccion ob=GestorConstrucciones.getConstruccion(i);
//                    if( ob.getEstado()!=-1)
//                    if( ( ob.getDuracion() + ob.getTiempoInicial()) <= Juego.turno ){
//                     //   Grafico.g.drawImage(marco, (x-xinicio)*25,50+(y-yinicio)*25,lx*25, ly*25, Grafico.applet);
//                        Grafico.g.setColor(Color.yellow);
//                        Grafico.g.drawRect((x-xinicio)*25,50+(y-yinicio)*25,lx*25, ly*25);
//                        Grafico.g.setColor(Color.red);
//                    }
//
//            }


            // System.out.println();

            if(punto.x!=-1&& punto.y!=-1){
                Grafico.g.setColor(Color.green);
            //Grafico.g.drawRect(0, 100,25,25);
               Grafico.g.drawRect((punto.x/25)*25, 50+((punto.y-50)/25)*25,25,25);
                Grafico.g.setColor(Color.red);
            }
            punto.x=-1;
            punto.y=-1;
            Grafico.g.clearRect(450,50,26,450);
            //tamX=-1;
            //tamY=-1;
        }

	public boolean disponible(int x, int y, int longx, int longy, char compatible){
		//if (x+longy >tamX || y+longy >tamY  || x<0 || y< 0) return false;
                x+=xinicio;
                y+=yinicio;
                if (x+longy >=tamX || y+longy >=tamY  || x<0 || y< 0) return false;
		for (int i = x; i< x+longx ;i++){
			for(int j = y; j< y + longy ; j++){
                            if ((matriz[i][j][1]!=null) || (matriz[i][j][2] != null) || 
                                ((Terreno)matriz[i][j][0]).getSimbolo() != compatible) return false;
			}
		}
		return true;
	}

	public void ubicarConstruccion(int x, int y, int longx, int longy, Object objeto, char rep){
                x+=xinicio;
                y+=yinicio;
		for (int i = x; i< x+longx ;i++){
                    for(int j = y; j< y + longy ; j++){
                            matriz[i][j][1]=objeto;
                    }
		}
	}

	public void ubicarObjeto(int x, int y, UnidadMilitar objeto){
                x+=xinicio;
                y+=yinicio;
                if(objeto==null) System.out.println("null");
                matriz[x][y][2]=objeto;
		
                return;
	}

        public boolean ocupado(int x,int y){
            x+=xinicio;
            y+=yinicio;
            if (x >17 || x<0 || y>17|| y<0) return true;
            if(matriz[x][y][1]!=null) return true;
            if(matriz[x][y][2]!=null) return true;
            return false;
        }

        public boolean compatible(int x, int y,Objeto unidad){
            x+=xinicio;
            y+=yinicio;
            if(unidad.getCompatible()==((Terreno)matriz[x][y][0]).getSimbolo() ) return true;
            System.out.println("Su unidad es compatible con "+ unidad.getCompatible());
            return false;
        }
        //metodo agregado para obtener el objeto en la posicion
        public Object getObjeto(int x,int y){
            x+=xinicio;
            y+=yinicio;
            return matriz[x][y][1];
        }

        public Object devolverObjeto(int x, int y){ //modificacion 8 devuelve el objeto ubicado en las coordenadas dadas
            return matriz[x][y][1];
        }
        public void eliminaUnidad(int x,int y){
            matriz[x][y][2]=null;
        }
        public int getTamX(){return tamX;}
        public int getTamY(){return tamY;}
        public void actualizaX(int n){
            if(xinicio+n+18<tamX && xinicio+n>=0)
            xinicio+=n;
            mostrar();
        }
        public void actualizaY(int n){
            if(yinicio+n+18<tamY && yinicio+n>=0)
            yinicio+=n;
            mostrar();
        }
}
